// 第 1 步：搭建文件骨架与基础类型

#pragma once

#include <cstdint>
#include <cstdio>

namespace Common {
// step 1:
// 首先写好头文件的基本结构、依赖、命名空间，以及日志元素 LogElement 的定义。
// 它使用 enum class LogType 标记数据类型，内部通过 union 存放不同原生类型的值。
constexpr size_t LOG_QUEUE_SIZE = 8 * 1024 * 1024;

enum class LogType : int8_t {
  CHAR = 0,
  INTEGER,
  LONG_INTEGER,
  LONG_LONG_INTEGER,
  UNSIGNED_INTEGER,
  UNSIGNED_LONG_INTEGER,
  UNSIGNED_LONG_LONG_INTEGER,
  FLOAT,
  DOUBLE
};

struct LogElement {
  LogType type_ = LogType::CHAR;
  union {
    char c;
    int i;
    long l;
    long long ll;
    unsigned u;
    unsigned long ul;
    unsigned long long ull;
    float f;
    double d;
  } u_;
};
}